package com.wm.offer.simple;

/**
 * @ClassName:Calculate
 * @Description:
 * @Author:Deamer
 * @Date:2021/10/10 16:09
 **/
public class Calculate {

    public static void main(String[] args) {
        int res = divide(1, 1);
        System.out.printf("结果是：" + res);

    }

    /**
     * 剑指 Offer II 001. 整数除法
     * 解决办法：使用左右移
     * 思路：如果被除数大于除数，被除数中含2的n次方的除数的倍数，也就是被除数含有多少个除数
     */
    private static int divide(int a, int b) {
        // a，b重新复制给新的变量值，否则溢出数据的正负没有办法判断
        long num1 = a;
        long num2 = b;
        long result = 0;
        // 判断有无负数
        boolean isLessZero = false;
        // 如果其中有一个有负数，结果便会有负数
        if (num1 < 0 && num2 > 0 || num1 > 0 && num2 < 0) {
            isLessZero = true;
        }
        // 将负数转为正数
        if (num1 < 0) num1 = -num1;
        if (num2 < 0) num2 = -num2;

        // 每循环一次，num1减掉除数的2的n次方的倍数的值
        while (num1 >= num2) {
            long tmp = num2;// 临时变量
            long count = 1;// 统计除数的倍数
            // 左移1位=*2
            while (num1 >= tmp) {
                tmp <<= 1;
                count <<= 1;
            }
            // 最后一次移位完，不进入循环，右移1位=/2
            tmp >>= 1;
            count >>= 1;
            num1 -= tmp;
            result += count;
        }
        result = isLessZero ? -result : result;
        // 处理溢出的数据
        if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            return Integer.MAX_VALUE;
        }
        return (int) result;
    }
}
